1、只有一个数出现一次，别的数出现3次，求出出现一次的数
思想：因为只有一个数出现一次，所以每个数的位加起来，结果不是3K+1，就是3K。这样将每个位都%3，得到的数就是出现一次的数
思想二：利用map的计数功能，太简单，，不阐述
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int bit[32]={0};
        for(auto e:nums)
        {
            for(int i=0;i<32;i++)
            {
                if(e&(1<<i))
                {
                    bit[i]+=1;
                }
            }
        }
        int ret=0;
        for(int i=0;i<32;++i)
        {
            if(bit[i]%3==1)
            {
                ret|=(1<<i);
            }
        }
        return ret;
    }
};


2、只有2个数出现一次，别的数都出现2次
思想：每个数按位^一下，得到就是出现一次的2个数的结果ret，在求出ret第一次出现一的位，出现1说明这2个数该位是不同的，因此可以按照该位为1分为一组，为0分为一组，
在各自^，就得到了结果

class Solution {
public:
    vector<int> singleNumbers(vector<int>& nums) {
        int ret=0;
        for(auto e:nums)
        {
            ret^=e;
        }
       
        int i=0;
        while(i<32)
        {
            if(ret&(1<<i))
            {
                break;
            }
            i++;
        }
        vector<int> v1;//第i位为1的
        vector<int> v2;//第ii为不为11的
        for(auto e:nums)
        {
            if(e&(1<<i))
            {
                v1.push_back(e);
            }
            else
            {
                v2.push_back(e);
            }
        }
       int x1=0;
       for(auto e:v1)
       {
           x1^=e;
       }
       vector<int> v;
       v.push_back(x1);
       int x2=0;
       for(auto e:v2)
       {
           x2^=e;
       }
       v.push_back(x2);
       return v;
    }
};